import java.util.*;

public class Test {
    // 题目1：N 字形变换
    public String convert(String s, int numRows) {
        if(numRows < 2){
            return s;
        }
        List<StringBuilder> rows = new LinkedList<>();
        for(int i = 0; i < numRows; i++){
            rows.add(new StringBuilder());
        }
        int i = 0;
        int flag = -1;
        for(char x : s.toCharArray()){
            rows.get(i).append(x);
            if(i == 0 || i == numRows - 1){
                flag = -flag;
            }
            i += flag;
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rows){
            res.append(row);
        }
        return res.toString();
    }

    // 题目2：移动所有球到每个盒子所需的最小操作数
    // 这是一个我理解了之后，觉得很神奇的解法！
    // 太妙拉！！！
    public int[] minOperations(String boxes) {
        char[] boll = boxes.toCharArray();
        int n = boll.length;
        int[] dp = new int[n]; // dp[i] 表示所有球放进该下标位置处的操作数总和
        int left = boll[0] - '0'; // 相对于后一个位置的左边所有球数，都少走了一个
        int right = 0; // 相对于前一个位置的右边所有球数，都多走了一个
        for(int i = 1; i < n; i++){
            if(boll[i] == '1'){
                right++;
                dp[0] += i;
            }
        }
        for(int i = 1; i < n; i++){
            dp[i] = dp[i - 1] + left - right;
            if(boll[i] == '1'){
                left++;
                right--;
            }
        }

        return dp;
    }

    // 啥是正则表达式咯？？
    public static void main1(String[] args) {
        String s = "abc\\a\\bfd";
        System.out.println(s);
        System.out.println(s.replace("\\","\\\\"));
        System.out.println(s.replaceAll("\\\\","\\\\\\\\"));
    }

    // 题目3：罗马数字转整数
    public int romanToInt(String s) {
        char[] ch = s.toCharArray();
        int res = 0;
        int n = ch.length;
        for(int i = 0; i < n - 1; i++){
            int front = change(ch[i]);
            int behind = change(ch[i + 1]);
            if(front >= behind){
                res += front;
            }else{
                res -= front;
            }
        }
        res += change(ch[n - 1]);
        return res;
    }

    public int change(char c){
        int res = 0;
        switch(c){
            case 'I':
                res = 1;
                break;
            case 'V':
                res = 5;
                break;
            case 'X':
                res = 10;
                break;
            case 'L':
                res = 50;
                break;
            case 'C':
                res = 100;
                break;
            case 'D':
                res = 500;
                break;
            case 'M':
                res = 1000;
                break;
        }
        return res;
    }

    public static void main(String[] args) {
        StringBuilder res = new StringBuilder();
        res.append("cx");
        System.out.println(res.toString());
    }

    // 题目 4 ：整数转罗马数字
    public String intToRoman1(int num) {
        StringBuilder res = new StringBuilder();
        while(num >= 1){
            if(num >= 1000){
                res.append('M');
                num -= 1000;
            }else if(num >= 900){
                res.append("CM");
                num -= 900;
            }else if(num >= 500){
                res.append("D");
                num -= 500;
            }else if(num >= 400){
                res.append("CD");
                num -= 400;
            }else if(num >= 100){
                res.append("C");
                num -= 100;
            }else if(num >= 90){
                res.append("XC");
                num -= 90;
            }else if(num >= 50){
                res.append("L");
                num -= 50;
            }else if(num >= 40){
                res.append("XL");
                num -= 40;
            }else if(num >= 10){
                res.append("X");
                num -= 10;
            }else if(num >= 9){
                res.append("IX");
                num -= 9;
            }else if(num >= 5){
                res.append("V");
                num -= 5;
            }else if(num >= 4){
                res.append("IV");
                num -= 4;
            }else{
                res.append("I");
                num -= 1;
            }
        }
        return res.toString();
    }

    // 还是采用官解比较好，太繁琐了，😀
    int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String[] romans = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

    public String intToRoman(int num) {
        int n = values.length;
        StringBuilder res = new StringBuilder();
        for(int i = 0; i < n; i++){
            int value = values[i];
            String roman = romans[i];

            while(num >= value){
                res.append(roman);
                num -= value;
            }

            if(num == 0){
                break;
            }
        }
        return res.toString();
    }

    // 题目5：统计匹配检索规则的物品数量
    // 虽然是个简单题，但是利用 hash 来存类型，以及其对应的下标，这种解法也十分巧妙！
    // 我甚是喜欢，哈哈哈哈
    public int countMatches(List<List<String>> items, String ruleKey, String ruleValue) {
        Map<String, Integer> map = new HashMap<>();
        map.put("type", 0);
        map.put("color", 1);
        map.put("name", 2);

        int index = map.get(ruleKey);
        int res = 0;
        for(List<String> item : items){
            if(item.get(index).equals(ruleValue)){
                res++;
            }
        }
        return res;
    }

    // 题目6：十-二进制数的最少数目
    public int minPartitions(String n) {
        int res = 0;
        for(int i = 0; i < n.length(); i++){
            int num = n.charAt(i) - '0';
            if(num == 9){
                return 9;
            }
            if(num > res){
                res = num;
            }
        }
        return res;
    }




}
